// var reverseKGroup = function (head, k) {
//     let dummy = new ListNode(0)
//     dummy.next = head
//     let cur = dummy

//     while (true) {
//         let start = cur.next
//         let end = cur
//         for (let i = 0; i < k; i++) {
//             end = end.next
//             if (!end) {
//                 return dummy.next // 不足k个，直接返回
//             }
//         }
//         let nextHead = end.next // 保存下一组的头节点
//         end.next = null // 断开当前组与下一组的连接
//         let reverseHead = reverse(start) // 翻转当前组，并连接前后部分
//         cur.next = reverseHead // 前驱节点连接到翻转后的头
//         start.next = nextHead // 当前组的尾节点连接到下一组的头
//         cur = start // 更新前驱节点为当前组的尾节点
//     }
// };

// function reverse(head) {
//     let pre = null
//     let cur = head
//     let next = head.next
//     while (cur) {
//         cur.next = pre
//         pre = cur
//         cur = next
//         if (next) {
//             next = next.next
//         }
//     }
//     return pre
// }

var reverseKGroup = function (head, k) {
    let dummy = new ListNode();
    dummy.next = head;
    let cur = dummy;

    while (true) {
        let start = cur.next;
        let end = cur;

        for (let i = 0; i < k; i++) {
            end = end.next;
            if (!end) {
                return dummy.next // 不足k个，直接返回
            }
        }
        let nextHead = end.next;
        end.next = null;
        reverse(start);
        cur.next = end;
        start.next = nextHead;
        cur = start;
    }
}

function reverse(head) {
    let pre = null;
    let cur = head;

    while (cur) {
        let next = cur.next;
        cur.next = pre;
        pre = cur;
        cur = next;
    }
    return pre;
}